Skip to content

ROS2 视频流传输与 WebRTC 集成 ​

机器人平台上的摄像头画面如何低延迟地送到浏览器或远程控制端,是监控与遥操作场景的常见需求。本文回答三个递进的问题:ROS2 怎么传输视频流;ROS2 是否用到了 WebRTC;WebRTC 又是如何接入 ROS2 通信体系的。关键结论均附事实来源,适合正在为机器人选型视频链路的 ROS2 开发者阅读。

一、ROS2 原生视频传输:基于 DDS ​

ROS2 的传输层是 DDS(Data Distribution Service),通过 rmw(ROS Middleware Interface)抽象隔离。各发行版默认实现是 Fast DDS(rmw_fastrtps_cpp),可以切换为 Cyclone DDS、RTI Connext,或非 DDS 的 Zenoh(ROS 2 官方中间件文档)。

在这套机制里,视频与普通消息没有本质区别,常用载体有三种:

消息类型 说明
sensor_msgs/Image 原始未压缩像素
sensor_msgs/CompressedImage JPEG/PNG 压缩
image_transport 插件 如 theora_image_transport、ffmpeg_image_transport(H.264)

数据通路为:Publisher 将 Image 序列化为 CDR,DDS 按传输类型(共享内存 SHM / UDP / TCP)分片下发,Subscriber 反序列化还原(Vulcanexus 图像压缩教程、ffmpeg_image_transport)。

裸视频直接走 DDS 的代价 ​

以 1080p RGB 为例,单帧约 6 MB(1920×1080×3 = 6,220,800 字节),30 fps 裸流约 1.5 Gbps(1920×1080×3×30×8 ≈ 1.49 Gbps)。未经压缩的原始视频直接交给 DDS 会带来三个问题:

  • 序列化与拷贝开销大,CPU 占用高;
  • 触发 DDS 大消息分片,UDP 多播环境下容易拥塞;
  • 链路带宽占用高,挤占其他话题。

因此工程实践通常先编码压缩(H.264/VP8)再发布,或把视频流从 DDS 中移出,改走专用流媒体通道(Clearpath 的视频流优化实践)。

QoS 方面,视频话题常用 BEST_EFFORT 配合适当的 Depth;但关键链路有时仍需要 RELIABLE。两种选择并不存在对所有场景都最优的方案,需按场景权衡。

二、ROS2 并不原生支持 WebRTC ​

rmw/DDS 与 WebRTC 是两套独立的协议栈,解决的问题不同:

维度 ROS2(DDS) WebRTC
定位 局域网内节点间发布/订阅 跨互联网实时音视频
NAT 穿透 无(或需额外配置) 自带 ICE/STUN/TURN
加密 可选(TLS) 强制 DTLS-SRTP
拓扑 多播/共享总线 P2P 或 SFU 转发

WebRTC 出现在 ROS2 生态中,基本都是为弥补 DDS 不擅长的场景:把机器人摄像头画面以低延迟推送到 Web 端,支撑远程监控与遥操作。

三、WebRTC 的接入方式:桥接节点 ​

两套协议栈通过一个桥接节点衔接:

桥接节点同时承担两种身份:

  1. 普通 ROS2 节点:用 rclcpp 订阅 /image_raw,经 cv_bridge 转为 cv::Mat,送入编码器。
  2. WebRTC peer:运行一份 WebRTC 栈(libwebrtc、aiortc、GStreamer webrtcbin 或 Pion 均可),把编码帧封装为 VideoTrack,经 ICE/DTLS/SRTP 发出;反向通过 DataChannel 接收遥控指令,再以 ROS2 消息(如 geometry_msgs/Twist)发布。

信令如何传递 ​

「WebRTC 是否经过 ROS2 通信接口」的关键在信令阶段(SDP offer/answer 与 ICE candidate 交换),有两种做法:

方式 做法 适用
信令走 ROS2 SDP/ICE 用 std_msgs/String 话题或 service,在机器人侧与(经 rosbridge 接入的)浏览器侧之间转发 复用 ROS2 网络,演示场景
信令走 WebSocket/HTTP 桥接节点额外提供 WebSocket/HTTP 信令服务,浏览器直连 已知主流实现采用的方式

需要注意边界:WebRTC 协商完成后,真正的音视频与数据流走 P2P 或 SFU 直传,不再经过 DDS。严格地说,「WebRTC 通过 ROS2 通信接口通信」只发生在信令阶段(PHNTM Bridge 文档、Foxglove Remote Access)。

四、主流实现 ​

项目 语言 特点
PHNTM Bridge C++ 高性能 WebRTC ROS2 桥,ROS Image/CompressedImage 话题以 H.264 视频流推送到浏览器
opentera-webrtc-ros C++/Python 基于 Google WebRTC 库的音视频/数据流节点,含遥操作功能,维护有 ros2 分支
Foxglove 平台服务 内建远程访问:image 数据转码为随带宽自适应的 WebRTC video track

这些实现的信令均由各自的服务体系完成,不走 DDS。

要点 ​

  • ROS2 原生传视频走 DDS + rmw,消息类型为 Image/CompressedImage;裸视频开销大,发布前需要压缩。
  • ROS2 不原生提供 WebRTC 能力,所有 WebRTC 功能来自社区桥接包。
  • WebRTC 通过桥接节点接入:桥接节点既是 ROS2 的 subscriber/publisher,又是 WebRTC peer。
  • 严格意义上「WebRTC 经过 ROS2 通信接口」只发生在信令阶段;媒体流协商完成后直传,不经 DDS。
  • 涉及「主流」「一定」的判断需要项目实证支撑,不宜凭经验断言。
最近更新

基于 VitePress 构建